package com.bt.lms.ui.page.sys.role.action;

import com.bt.lms.constants.PageConstant;
import com.bt.lms.constants.SysBizTypeConstant;
import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.utils.Encode;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.page.sys.vo.RoleTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 删除角色按钮事件（角色列表）
 * @author 徐大永
 */
public class RLDeleteBtnAction implements EventHandler<ActionEvent> {

    /**
     * 要删除的角色
     */
    private final RoleTableViewVo roleTableViewVo;

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 所在容器
     */
    private final Pane inPane;

    /**
     * 构建事件
     *
     * @param roleTableViewVo 要删除的角色
     * @param pageSkipInfo    界面跳转信息
     * @param inPane 所在容器
     */
    public RLDeleteBtnAction(RoleTableViewVo roleTableViewVo, PageSkipInfo pageSkipInfo, Pane inPane){
        this.roleTableViewVo = roleTableViewVo;
        this.pageSkipInfo = pageSkipInfo;
        this.inPane = inPane;
    }

    /**
     * 事件实现
     *
     * @param event the event which occurred
     */
    @Override
    public void handle(ActionEvent event) {

        Alert alert = new Alert(Alert.AlertType.NONE);
        alert.setHeaderText(null);//自带提示
        alert.setTitle("删除");
        PageRoleDelete pageRoleDelete = new PageRoleDelete(alert, roleTableViewVo,pageSkipInfo,inPane);
        alert.setGraphic(pageRoleDelete);//内容显示
        alert.getDialogPane().setMaxWidth(PageConstant.DELETE_WIGHT);//宽度
        alert.getDialogPane().setMaxHeight(PageConstant.DELETE_HEIGHT);////高度
        alert.showAndWait();

    }
}

/**
 * 删除角色界面
 */
class PageRoleDelete extends VBox {

    /**
     * 构建界面
     *
     * @param alert           弹框
     * @param roleTableViewVo 角色信息
     * @param pageSkipInfo    界面跳转信息
     * @param inPane 所在容器
     */
    public PageRoleDelete(Alert alert, RoleTableViewVo roleTableViewVo, PageSkipInfo pageSkipInfo, Pane inPane) {

        //布局
        this.setSpacing(PageConstant.PANE_TINY_SPACING);
        this.setAlignment(Pos.CENTER);
        this.setPadding(new Insets(PageConstant.NODE_TINY_WIGHT));
        this.setPrefWidth(PageConstant.DELETE_WIGHT);
        this.setPrefHeight(PageConstant.DELETE_HEIGHT);

        String name = roleTableViewVo.getName();
        String hint = "是否删除角色：" + name;
        //组件
        Label label = new Label(hint);
        label.setPrefWidth(PageConstant.NODE_BIG_WIGHT);
        label.setAlignment(Pos.CENTER);
        this.getChildren().addAll(label);

        HBox hBox = new HBox();
        hBox.setSpacing(PageConstant.PANE_SPACING);
        hBox.setAlignment(Pos.CENTER);
        this.getChildren().add(hBox);

        Button confirm = new Button("确认");
        hBox.getChildren().add(confirm);
        //事件
        DeleteRoleConfirmBtnAction deleteRoleConfirmBtnAction = new DeleteRoleConfirmBtnAction(alert, roleTableViewVo,pageSkipInfo,inPane);
        confirm.setOnAction(deleteRoleConfirmBtnAction);

        Button cancel = new Button("取消");
        hBox.getChildren().add(cancel);
        //事件
        cancel.setOnAction(event -> {
            ButtonType buttonType = new ButtonType("");
            alert.getDialogPane().getButtonTypes().add(buttonType);
            alert.close();
        });
    }
}

/**
 * 删除用户界面确认按钮事件
 */
class DeleteRoleConfirmBtnAction implements EventHandler<ActionEvent> {

    /**
     * 弹窗
     */
    private final Alert alert;

    /**
     * 要删除的对象
     */
    private final RoleTableViewVo roleTableViewVo;

    /**
     * 界面跳转信息
     */
    private final  PageSkipInfo pageSkipInfo;

    /**
     * 所在容器
     */
    private final Pane inPane;

    /**
     * 构建事件
     *
     * @param alert        弹窗
     * @param roleInfoVo   要删除的角色
     * @param pageSkipInfo 界面跳转信息
     * @param inPane 所在容器
     */
    public DeleteRoleConfirmBtnAction(Alert alert, RoleTableViewVo roleInfoVo, PageSkipInfo pageSkipInfo,Pane inPane) {
        this.alert = alert;
        this.roleTableViewVo = roleInfoVo;
        this.pageSkipInfo = pageSkipInfo;
        this.inPane = inPane;
    }

    @Override
    public void handle(ActionEvent event) {
        //去除弹窗
        ButtonType buttonType = new ButtonType("");
        alert.getDialogPane().getButtonTypes().add(buttonType);
        alert.close();

        //组装网络消息包
        ReqMsg reqMsg = Encode.encodeToMsg(roleTableViewVo, SysBizTypeConstant.ROLE_DELETE);
        byte[] bytes = reqMsg.toBytes();
        //4.组网
        Socket socket = pacNet();
        //5.发送
        boolean res = sendReq(socket, bytes);
        if (res) {
            //成功发送，程序结束
            finish();
        } else {
            String failStr = "未能成功删除，请稍候重试。";
            hintFrame(failStr);//提示框
        }
    }

    /**
     * 程序结束
     */
    private void finish() {

        //提示弹窗
        Alert alert = new Alert(Alert.AlertType.INFORMATION);

        //保存提示
        alert.setTitle("成功");
        alert.setHeaderText(null);
        alert.setContentText("删除成功");
        alert.showAndWait();

        //重新加载界面
        //NetWorkUtils.reqRolePagingPage(inPane,new Page<>(),pageSkipInfo);
        NetWorkUtils.reqRolePagingPage(pageSkipInfo,new Page<>());

    }

    /**
     * 发送请求
     *
     * @param socket 客户端连接
     * @param bytes  要发送的数据
     * @return 发送结果
     */
    private boolean sendReq(Socket socket, byte[] bytes) {


        try {
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(bytes);
            outputStream.flush();

            //关闭资源
            outputStream.close();
            socket.close();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return true;

    }

    /**
     * 组网
     *
     * @return 网
     */
    private Socket pacNet() {

        String ip = ServerInfo.IP;
        int port = ServerInfo.PORT;

        Socket socket;
        try {
            socket = new Socket(ip, port);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return socket;
    }

    /**
     * 程序终止
     * 弹窗提示
     *
     * @param result 终止提示
     */
    private void hintFrame(String result) {
        //提示弹窗
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        //错误提示
        alert.setTitle("失败");
        alert.setHeaderText(null);
        alert.setContentText(result);
        alert.showAndWait();
    }
}
